package edu.utn.tacs.grupouno.negocio;

import java.util.Collection;
import java.util.LinkedList;
import java.util.UUID;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import edu.utn.tacs.grupouno.dao.PersistentObject;
import edu.utn.tacs.grupouno.exception.SystemException;

@XmlRootElement
@Entity
public class Estudio extends PersistentObject implements Cloneable {

	private static final long serialVersionUID = 1006274911627174228L;

	private String nombre = "";

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@XmlElementWrapper(name="indicadores")
	@XmlElement(name="indicador")
	private Collection<Indicador> indicadores;
	
	public Estudio() {
		indicadores = new LinkedList<Indicador>();
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public void addIndicador(Indicador indicador) {
		indicadores.add(indicador);
	}
	
	public void addIndicadores(Collection<Indicador> indicadores) {
		this.indicadores.addAll(indicadores);
	}
	
	public boolean estanIndicadoresOk() {
		if (indicadores.size() == 0) {
			return false; //TODO: puede haber estudios sin indicadores?
		}
		
		for (Indicador indicador : indicadores) {
			if (!indicador.estaOk()) {
				return false;
			}
		}
		return true;
	}

	@XmlTransient
	public Collection<Indicador> getIndicadores() {
		return indicadores;
	}
	
	public void setIndicadores(Collection<Indicador> indicadores) {
		this.indicadores = indicadores;
	}

	@XmlTransient
	public Collection<Indicador> getIndicadoresCargados() {
		Collection<Indicador> indicadoresCargados = new LinkedList<Indicador>();
		
		for (Indicador indicador : indicadores) {
			if (indicador.tieneResultado()) {
				indicadoresCargados.add(indicador);
			}
		}
		
		return indicadoresCargados;
	}
	
	/**
	 * 
	 * @return true si todos los indicadores tienen cargado un resultado,
	 * false si no hay ningun indicador o alguno esta vacio
	 */
	public boolean seCargaronTodosLosIndicadores() {
		for (Indicador indicador : indicadores) {
			if (!indicador.tieneResultado()) {
				return false;
			}
		}
		return !indicadores.isEmpty();
	}

	@Override
	public Object clone() {
		try{
			Estudio estudioClon = (Estudio) super.clone();
			estudioClon.setIndicadores(new LinkedList<Indicador>());
			estudioClon.setId(UUID.randomUUID());
			
			for (Indicador indicador : this.getIndicadores()) {
				estudioClon.addIndicador((Indicador) indicador.clone());
			}
			
			return estudioClon;
		}
		catch (CloneNotSupportedException e) {
			throw new SystemException("No se pudo clonar estudio!");
		}
	}
	

}
